﻿// -------------------------------------------------------------------------
//    @FileName         :    NFBagNestedCreation.h
//    @Author           :    Gao.Yi
//    @Date             :    2025-10-21
//    @Email			:    445267987@qq.com
//    @Module           :    NFBagNestedCreation
//    @Desc             :
//
// -------------------------------------------------------------------------

// --- 文件总结 ---------------------------------------------------------------
// 基类模板 `NFBagBaseOp` 为所有“需要提交”的背包操作管理器提供通用机制：
// - 嵌套创建防护：同一 ownerId 在未提交前禁止再次创建（避免重入篡改）
// - 提交语义：要求显式调用 BaseCommit() 才视为生命周期结束
// - 基础校验：BaseCommitCheck() 对“需提交/非嵌套/未提交”进行统一校验
// 该类不涉及具体背包逻辑，仅提供通用的生命周期与安全约束。
// ---------------------------------------------------------------------------

#pragma once

#include "NFComm/NFObjCommon/NFObject.h"
#include "NFComm/NFPluginModule/NFStackTrace.h"

template <class OpMgrClass>
class NFBagBaseOp;

/**
 * @brief 需要提交的背包操作基类（模板参数为派生的操作管理器类型）
 * @tparam OpMgrClass 派生类类型，用于静态成员隔离
 */
template<typename OpMgrClass>
class NFBagBaseOp
{
public:
    /**
     * @brief 构造函数
     * @param ownerId 归属ID（用于嵌套防护的唯一标识）
     * @param bNeedCommit 是否需要提交（true: 受嵌套与提交校验约束）
     */
    NFBagBaseOp(uint64_t ownerId, bool bNeedCommit): m_ownerId(ownerId), m_bNeedCommit(bNeedCommit), m_bNestCreate(false), m_bCommit(false)
    {
        if (m_bNeedCommit)
        {
            if (m_createOwnerIDs.find(m_ownerId) != m_createOwnerIDs.end())
            {
                m_bNestCreate = true;
                LOG_ERR(m_ownerId, -1, "nest create, can`t be op. TRACE_STACK:{}", TRACE_STACK());
            }
            else
            {
                m_createOwnerIDs.insert(m_ownerId);
            }
        }
    }
    /**
     * @brief 析构函数
     * 若需要提交且非嵌套创建且未提交，则从创建集合中移除
     */
    virtual ~NFBagBaseOp()
    {
        if (m_bNeedCommit && !m_bNestCreate && !m_bCommit)
        {
            m_createOwnerIDs.erase(m_ownerId);
        }
    }
public:
    /**
     * @brief 提交前的通用校验
     * - 必须需要提交
     * - 禁止嵌套创建
     * - 禁止重复提交
     * @return 0 表示通过，否则错误码
     */
    int BaseCommitCheck()
    {
        if (!m_bNeedCommit)
        {
            CHECK_ERR(m_ownerId, -1, "not need commit");
        }

        if (m_bNestCreate) // 是嵌套创建的本对象，不允许操作
        {
            CHECK_ERR(m_ownerId, -1, "nest create, can`t be op");
        }

        if (m_bCommit)
        {
            CHECK_ERR(m_ownerId, -1, "had commit");
        }

        return 0;
    }

    /**
     * @brief 提交操作（未提交前所有变更不生效）
     * 调用后会释放“嵌套创建防护”，禁止重复提交。
     */
    int BaseCommit()
    {
        m_bCommit = true;
        if (!m_bNestCreate)
        {
            m_createOwnerIDs.erase(m_ownerId);
        }
        return 0;
    }
protected:
    /** @brief 所有者ID（用于嵌套防护的唯一标识） */
    uint64_t m_ownerId;
    /** @brief 是否需要提交（true: 受嵌套与提交校验约束） */
    bool m_bNeedCommit;
    /** @brief 是否为嵌套创建（true: 禁止操作） */
    bool m_bNestCreate;
    /** @brief 是否已提交（true: 禁止重复提交） */
    bool m_bCommit;
protected:
    /** @brief 静态集合：记录当前正在创建的 ownerId，用于嵌套防护 */
    static std::set<uint64_t> m_createOwnerIDs;
};

template<typename OpMgrClass>
std::set<uint64_t> NFBagBaseOp<OpMgrClass>::m_createOwnerIDs;